#include <stdio.h>
#include <stdlib.h>

#include "./TDA_ArbolBinarioBusqueda.h"

typedef tDato tEntero;

tEntero crearEntero(int pValor);
int destruirEntero (tEntero pEntero);
int ordenPrecedenciaEntero(tEntero pEnteroA, tEntero pEnteroB);  
int enteroAInt (tEntero pEntero);
tEntero asignarValorAEntero (tEntero pEntero, int pValor);

void imprimirArbol (FILE* stream, tArbolBinarioBusqueda arbol);

int main(int argc, char *argv[])
{

  tArbolBinarioBusqueda arbol;
  crearArbol(&arbol, &destruirEntero, &ordenPrecedenciaEntero);

  agregarDatoArbol(arbol, crearEntero(5));
  agregarDatoArbol(arbol, crearEntero(1));
  agregarDatoArbol(arbol, crearEntero(10)); 
  agregarDatoArbol(arbol, crearEntero(3));

  imprimirArbol(stdout, arbol);

  tEntero aux = crearEntero (5);
  removerDatoArbol(arbol, aux);
  
  asignarValorAEntero(aux, 3);
  removerDatoArbol(arbol, aux);

  asignarValorAEntero(aux, 1);
  removerDatoArbol(arbol, aux);

  asignarValorAEntero(aux, 10);
  removerDatoArbol(arbol, aux);
  
  removerDatoArbol(arbol, aux);
  
  destruirEntero(aux);

  imprimirArbol(stdout, arbol);
  
  destruirArbol(arbol);
  
  return 0;
  
} // main

//==============================================================================

void imprimirArbol (FILE* stream, tArbolBinarioBusqueda arbol)
{
  tIteradorEnOrden iterador = obtenerIteradorEnOrden(arbol);
  int cnt = 10;
  while (iteradorEnOrdenMoverSiguiente(iterador) && cnt > 0)
  {
    tEntero entero = (tEntero) iteradorEnOrdenObtenerActual(iterador);
    fprintf (stream, "%d\n", enteroAInt(entero));
    cnt--;
  }

  liberarIteradorEnOrden(iterador);
}

tEntero crearEntero(int pValor){

  tEntero entero = malloc (sizeof (int));
  
  if (entero) 
    *((int*)entero) = pValor;
  
  return entero;
  
}

tEntero asignarValorAEntero (tEntero pEntero, int pValor){
  
  if (pEntero)
    *((int*)pEntero) = pValor;
  
  return pEntero;
}

int destruirEntero (tEntero pEntero){
  
  if (pEntero) free (pEntero);

}

int ordenPrecedenciaEntero(tEntero pEnteroA, tEntero pEnteroB){
  
  int precedencia = 0;
  
  int val = *((int*)pEnteroA) - *((int*)pEnteroB);
  
  if (val> 0)
    precedencia = 1;
  
  else if (val < 0)
    precedencia = -1;
  
  return precedencia;
    
}


int enteroAInt (tEntero pEntero)
{
  if (pEntero)
  {
     return *((int*)pEntero);
  }
}
